import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

Vue.use(VueRouter)

// 导入网页加载进度条
import Nprogress from 'nprogress'
import 'nprogress/nprogress.css'

import store from '@/store'

// 先保存原始的 VueRoute push方法的引用
const originPush = VueRouter.prototype.push
const originReplace = VueRouter.prototype.replace

// 重写push
VueRouter.prototype.push = function (location, okCallback, failCallback) {
  if (okCallback && failCallback) {
    return originPush.call(this, location, okCallback, failCallback)
  } else {
    return originPush.call(this, location).catch(() => {})
  }
}

VueRouter.prototype.replace = function (location, okCallback, failCallback) {
  if (okCallback && failCallback) {
    return originReplace.call(this, location, okCallback, failCallback)
  } else {
    return originReplace.call(this, location).catch(() => {})
  }
}

// 关闭进度条小圈
Nprogress.configure({ showSpinner: false })

// 创建路由器对象
const router = new VueRouter({
  routes,
})

// 全局（针对所有路由）前守卫
router.beforeEach((to, from, next) => {
  Nprogress.start()
  if (store.state.token) {
    if (to.path === '/login') {
      next({ path: '/home' })
      Nprogress.done()
    } else {
      next()
    }
  } else {
    // 没有token
    if (to.path === '/login') {
      next()
    } else {
      // 注意：有的需要权限（/order），有的不需要权限(/home,/category)
      if (to.meta.requireAuth) {
        // 无token，但是需要权限的， 跳转到登录页面需要携带原来的路径，便于后续登录成功直接回到此路径，提高用户体验
        next({ path: '/login', query: { redirect: to.fullPath } })
      } else {
        next()
      }
    }
  }
})

// 全局（针对所有路由）后守卫
router.afterEach(() => {
  Nprogress.done()
})

// 导出路由器对象
export default router
